import java.util.Scanner;

public class Text {
    public static void main(String[] args) {
        System.out.println(func2());
        //当try 和 finally 同时有return时只会执行finally的return因为finally 一定会执行）
        //这是finally的注意事项
    }
    public static int func2(){
        try {
            return 10;
        }finally {
            return 20;
        }
    }


    public static void main4(String[] args) {
        /**
         * 抛出异常
         */
        func(10,1);

    }

                                              //异常说明
                                              //把可能抛出的异常显式的标注在方法定义的位置. 从而提醒调用者要注意捕获这些异常
    public static int func(int x,int y) throws ArrayIndexOutOfBoundsException{
        if(x == 0 || y == 0) {
            throw new ArithmeticException("抛出除 0 异常");
            //在这个代码中, 我们可以根据实际情况来抛出需要的异常. 在构造异常对象同时可以指定一些描述性信息
        }
        return x/y;
    }
    public static void main3(String[] args) {
        /**
         * 使用 try 负责回收资源
         * 刚才的代码可以有一种等价写法, 将 Scanner 对象在 try 的 ( ) 中创建, 就能保证在 try 执行完毕后自动调用 Scanner
         * 的 close 方法.
         *
         * 按下 alt + enter, 会弹出一个改进方案的弹窗
         */
        try (Scanner scanner = new Scanner(System.in)) {
            try {
                    int num = scanner.nextInt();
                System.out.println("num = " + num);
            } catch (Exception e) {
                    e.printStackTrace();
            }
        }
    }
    public static void main2(String[] args) {
        int[] array = new int[] {1,2,3,4,5};
        try {
            System.out.println("before");
            array = null;
            System.out.println(array[1]);
        }catch(Exception e) {
            e.printStackTrace();
        }finally {
            /**
             * 无论是否存在异常, finally 中的代码一定都会执行到.
             * 保证最终一定会执行到 Scanner 的 close 方法
             */
            System.out.println("finally code");
        }
    }



    public static void main1(String[] args) {
        int[] array = new int[] {1,2,3,4,5};

        try {
            /**
             * 我们发现, 一旦 try 中出现异常,
             * 那么 try 代码块中的程序就不会继续执行,
             * 而是交给 catch 中的代码来执行. catch 执行完毕会继续往下执行.
             */
            System.out.println("before");//正常打印
//            array = null;
            System.out.println(array[100]);//发现异常 抛出异常
            System.out.println("after");
        }catch (ArrayIndexOutOfBoundsException e){//抓捕异常
            e.printStackTrace();
        }
        System.out.println("after try catch");//正常打印
    }
}
